package BFS_DFS;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Node{
    int x,y;//位置（x,y）
}

public class BFS_岛屿问题 {
    static Node node=new Node();
    static int n;//行
    static int m;//列
    static int[][] a;//矩阵
    static boolean[][] inq;//记录是否入队
    static int X[]={0,0,1,-1};
    static int Y[]={1,-1,0,0};//上下左右

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        a=new int[n][m];
        inq=new boolean[n][m];
        int ans=0;//岛屿个数
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                inq[i][j]=false;
                a[i][j]=sc.nextInt();
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if(a[i][j]==1&&inq[i][j]==false){//元素为1且未入队
                    ans++;
                    bfs(i,j,n,m);//访问整个块，将该块‘1’的inq标记为true
                }
            }
        }
        System.out.println(ans);
    }

    static void bfs(int x,int y,int n,int m){
        Queue<Node> queue=new LinkedList<>();
        node.x=x;
        node.y=y;
        queue.offer(node);//结点入队
        inq[x][y]=true;//设置已入队
        while (!queue.isEmpty()){
            Node top=queue.poll();//返回队首并出队
            for (int i = 0; i < 4; i++) {
                int newX=top.x+X[i];
                int newY=top.y+Y[i];
                if(judge(newX,newY)){//如果新位置需要访问
                    Node node1=new Node();//生成新结点
                    node1.x=newX;
                    node1.y=newY;
                    queue.offer(node1);//入队
                    inq[newX][newY]=true;//已入队
                }
            }
        }
    }

    //判断坐标（x,y）是否需要访问
    static Boolean judge(int x,int y){
        if(x>=n||x<0||y>=m||y<0){//越界
            return false;
        }
        if(a[x][y]==0||inq[x][y]==true){//位置为0或已入队
            return false;
        }
        return true;
    }
}
